package com.atwisdom.star.core.dsl.modelClass.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.atwisdom.star.common.util.JsonUtil;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class ChainHier {
    private String type;
    private List<ChainHierContent>  content = new ArrayList<>();

    public List<ChainHierContent> getContent() {
        return content;
    }

    public void setContent(List<ChainHierContent> content) {
        this.content = content;
    }

    public ChainHier(JSONObject hierProperties) {
        this.type = hierProperties.getString("type");
        JSONArray tempContent = hierProperties.getJSONArray("content");
        for (int i = 0; i < tempContent.size(); i++) {
            JSONObject contentJson = tempContent.getJSONObject(i);
            JSONArray properties = contentJson.getJSONArray("properties");
            JSONObject jsonObject = this.fetchValues(properties);
            ChainHierContent hierContent = JSONObject.parseObject(JSON.toJSONString(contentJson), ChainHierContent.class);
            hierContent.setValues(jsonObject);
            hierContent.setType(type);
            content.add(hierContent);
        }
    }

    /**
     * 获取默认values
     *
     * @return 返回结果
     */
    public JSONObject fetchValues(JSONArray properties) {
        JSONObject values = new JSONObject();
        for (Object item : properties) {
            JSONObject itemJson = JsonUtil.toJSONObject(item);
            String name = itemJson.getString("name");
            if(StringUtils.isNotBlank(name)){
                values.put(itemJson.getString("name"), itemJson.get("defaultValue"));
            }
        }
        return values;
    }

    /**
     * 将当前实例转换成JSONObject
     * @return 返回结果
     */
    public JSONObject fetchJsonObject() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", this.type);
        JSONArray contentAry = JSONArray.parseArray(JSONArray.toJSONString(this.content));
        jsonObject.put("content", contentAry);
        return jsonObject;
    }

    public static JSONObject fetchUpdateHier(JSONObject hierProperties, JSONObject updateHier) {
        if(hierProperties==null || hierProperties.size() <1){
            return new JSONObject();
        }
        ChainHier initHier = new ChainHier(hierProperties);
        if(updateHier==null || updateHier.size() == 0){
            return initHier.fetchJsonObject();
        }

        ChainHier updateChainHier = JSONObject.parseObject(JSON.toJSONString(updateHier), ChainHier.class);
        List<ChainHierContent> hierContents = new ArrayList<>();
        initHier.getContent().forEach(c -> {
            JSONObject link = c.getLink();
            String modelLinkClassName = link.getString("className");
            JSONObject initValues = c.getValues();
            ChainHierContent chainHierContent = updateChainHier.getContent().stream().filter(item -> item.getId().equalsIgnoreCase(c.getId())).findFirst().orElse(null);
            if(chainHierContent!=null){
                JSONObject contentLink = chainHierContent.getLink();
                String insLinkClassName = contentLink.getString("className");
                JSONObject updateValues = chainHierContent.getValues();
                JSONObject values = JsonUtil.merge(initValues, updateValues);
                chainHierContent.setValues(values);
                if(!modelLinkClassName.equalsIgnoreCase(insLinkClassName)){
                    chainHierContent.setLink(link);
                }
                hierContents.add(chainHierContent);
            }else{
                hierContents.add(c);
            }
        });
        updateChainHier.setContent(hierContents);
        return updateChainHier.fetchJsonObject();
    }

}
